package cn.zqy.demo2.day04.demo01;

import java.util.HashMap;
import java.util.Map;

/**
 * java.util.Map<k,v>集合
 *     Map集合的特点:
 *         1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
 *         2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
 *         3.Map集合中的元素,key是不允许重复的,value是可以重复的
 *         4.Map集合中的元素,key和value是一一对应
 *     java.util.HashMap<k,v>集合 implements Map<k,v>接口
 *     HashMap集合的特点:
 *         1.HashMap集合底层是哈希表:查询的速度特别的快
 *             JDK1.8之前:数组+单向链表
 *             JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
 *         2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
 *    java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
 *    LinkedHashMap的特点:
 *         1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
 *         2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的*/


/*
*  4种map常用方法。存
*       1.public V put(K key, V value):  把指定的键与指定的值添加到Map集合中。
*               存储键值对的时候,key不重复,返回值V是null
                存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值

        2. public V get(Object key) 根据指定的键，在Map集合中获取对应的值。
                key存在,返回对应的value值
                key不存在,返回null

        3.public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除，返回被删除元素的值。
                key存在,v返回被删除的值
                key不存在,v返回null

        4. boolean containsKey(Object key) 判断集合中是否包含指定的键。
        包含返回true,不包含返回false
* */
public class Demo01Map {
    public static void main(String[] args) {
        putMap();
        System.out.println("==========");
        getMap();
        System.out.println("==========");
        removeMap();
        System.out.println("==========");
        contain();
    }

    // 1. put()  向map中添加数据
    private static void putMap() {
        Map<String, String> li = new HashMap<>();
        li.put("贾乃亮","李小璐");
        li.put("李易峰","赵丽颖");
        li.put("杨幂","何凯文");
        String put1 = li.put("杨过", "小龙女");
        System.out.println(put1);  // 没有杨过 返回null
        System.out.println(li);  // {贾乃亮=李小璐, 杨过=小龙女, 杨幂=何凯文, 李易峰=赵丽颖}
        String put2 = li.put("杨幂","胡歌");
        System.out.println(put2);   // 有杨幂 返回何凯文
        System.out.println(li); // {贾乃亮=李小璐, 杨过=小龙女, 杨幂=胡歌, 李易峰=赵丽颖}
    }

    // 2. get()  在Map集合中获取对应的值
    private static void getMap() {
        Map<String, Integer> li = new HashMap<>();
        li.put("贾乃亮",12);
        li.put("李易峰",67);
        li.put("杨幂",90);
        Integer kkk = li.get("kkk");
        // 注意：多使用包装类
        // int kk = li.get("aaa");  //自动拆箱  NullPointerException（空指针）,无法吧null赋值给基本类型。。。
        System.out.println(kkk);  // 没有对应的键值，返回null。。
        System.out.println(li);   // {贾乃亮=12, 杨幂=90, 李易峰=67}
        Integer y = li.get("杨幂");  // 90
        System.out.println(y);
    }

    public static void removeMap() {
        Map<String, Integer> li = new HashMap<>();
        li.put("贾乃亮",12);
        li.put("李易峰",67);
        li.put("杨幂",90);
        Integer l = li.remove("l");
        System.out.println(l);  // 没有找到就返回null
        System.out.println(li); // {贾乃亮=12, 杨幂=90, 李易峰=67}
        Integer ll = li.remove("杨幂");  // 90
        System.out.println(ll);
        System.out.println(li);  // {贾乃亮=12, 李易峰=67}
    }

    public static void contain(){
        Map<String, Integer> li = new HashMap<>();
        li.put("贾乃亮",12);
        li.put("李易峰",67);
        li.put("杨幂",90);
        boolean j = li.containsKey("贾乃亮");
        System.out.println(j);  // 有则放回true
    }
}
